Shutter DAO 0x36 × Octant v2

Integration Plan

Overview

Shutter DAO 0x36 will integrate with Octant v2 through the SHUGrantPool Strategy — an ERC-4626 yield-donating vault configured with Morpho's "Steakhouse" USDC yield strategy (rated A+ by Credora, ~4-6% APY).

Component Purpose Capital
SHUGrantPool Strategy Generate yield for public goods funding 1M USDC

Architecture Note: The strategy IS the ERC-4626 vault. No MultistrategyVault wrapper is needed since only one strategy is approved by the DAO. This simplifies deployment, reduces gas costs, and eliminates unnecessary complexity.

Prerequisites (Pending Items)

The following items must be resolved before executing the DAO proposal:

Item Status Owner Notes
Dragon Funding Pool address ⏳ Pending Shutter DAO Strategy donation recipient
Keeper Bot address ⏳ Pending Shutter DAO Strategy keeper for harvesting
Emergency Shutdown Admin address ⏳ Pending Shutter DAO Can shutdown strategy and perform emergency withdrawals

⚠️ Action Required: Update this document with actual addresses before submitting the proposal.

Verified On-Chain Addresses

Entity Address Network
Shutter DAO Treasury 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 Ethereum
Azorius Module 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e Ethereum
SHU Token 0xe485E2f1bab389C08721B291f6b59780feC83Fd7 Ethereum
USDC 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 Ethereum
Morpho Strategy Factory 0x052d20B0e0b141988bD32772C735085e45F357c1 Ethereum
Tokenized Strategy 0xb27064A2C51b8C5b39A5Bb911AD34DB039C3aB9c Ethereum
Yearn Strategy USDC 0x074134A2784F4F66b6ceD6f68849382990Ff3215 Ethereum
PaymentSplitter Factory 0x5711765E0756B45224fc1FdA1B41ab344682bBcb Ethereum

SHUGrantPool Strategy

The MorphoCompounderStrategy is itself an ERC-4626 vault (via Yearn's TokenizedStrategy). Treasury deposits USDC directly into the strategy.

Underlying Yield Source

Yearn Strategy USDC — Deposits into Morpho lending markets via Yearn's aggregator vault.

Role Assignments

Role Assigned To Description
Management Shutter DAO Treasury (0x36bD...32c4) Administrative role (set keeper, set emergency admin, shutdown)
Keeper Dedicated Bot/EOA REQUIRED: Authorized to call report()/tend() to harvest yields without governance votes
Emergency Admin Shutter DAO Treasury (0x36bD...32c4) Can shutdown the strategy and perform emergency withdrawals

Critical: The Keeper should be a dedicated EOA or bot, NOT the Treasury Safe. Assigning Keeper to Treasury would require a governance vote for every harvest, creating severe operational bottlenecks.

Yield Distribution

Destination Allocation
Dragon Funding Pool 100%

Shutter DAO Governance

Architecture

Shutter DAO 0x36 uses Fractal (Decent) for on-chain governance, built on Safe:

Component Address / Value
Safe (Treasury) 0x36bD3044ab68f600f6d3e081056F34f2a58432c4
Azorius Module 0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e
Voting Token SHU (0xe485E2f1...Fd7)

Execution Call Chain

┌──────────────────────────────────────────────────────────────────────────┐ │ Step 1: Any EOA calls Azorius to execute passed proposal │ │ executeProposal(proposalId) │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ │ Azorius Module (0xAA6BfA174d2f803b517026E93DBBEc1eBa26258e) │ │ │ └────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ Step 2: Azorius calls Safe via module interface │ │ execTransactionFromModule(to, value, data, operation) │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ │ DAO Safe / Treasury (0x36bD3044ab68f600f6d3e081056F34f2a58432c4) │ │ │ └────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ Step 3: Safe executes transaction to target contract │ │ msg.sender = Safe (0x36bD...) │ │ │ │ │ ▼ │ │ ┌────────────────────────────────────────────────────────────────────┐ │ │ │ Target Contract (Factory / USDC / Strategy) │ │ │ └────────────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────────────┘

Critical: From the target contract's perspective, msg.sender is the Safe address (0x36bD...), NOT the Azorius module. This is why all roles are assigned to the Treasury Safe address.

Governance Parameters

See current governance parameters on the Decent DAO App.

Voting Platforms

Platform Type Use Case
Decent On-chain Treasury transactions, contract interactions
Snapshot Off-chain Temperature checks, non-binding polls

Execution Playbook

Phase 1: Strategy Deployment

The entire deployment can be executed in a single DAO proposal with 1 batched MultiSend containing 3 operations:

  1. Deploy Strategy via Factory
  2. Approve USDC to Strategy (uses precomputed Strategy address)
  3. Deposit USDC into Strategy

Key optimization: The strategy factory uses CREATE2, allowing address precomputation. This enables batching all 3 operations without waiting for return values.

MultiSend requirement: Execute MultiSend with operation=DELEGATECALL. Using CALL makes msg.sender the MultiSend contract and will break USDC approvals.

Gas Profile

Component Gas Cost
DAO Proposal (1 batched call, 3 operations) ~1M
EIP-7825 Limit 16,777,216
Headroom >92%

Transaction Details

Transaction 1: Deploy Strategy

Target:   0x052d20B0e0b141988bD32772C735085e45F357c1 (Morpho Strategy Factory)
Function: createStrategy(string,address,address,address,address,bool,address)
Selector: 0x31d89943
Value:    0

Parameters:
  _name:                     "SHUGrantPool"
  _management:               0x36bD3044ab68f600f6d3e081056F34f2a58432c4
  _keeper:                   [KEEPER_ADDRESS] (dedicated bot)
  _emergencyAdmin:           [EMERGENCY_ADMIN_ADDRESS]
  _donationAddress:          [DRAGON_FUNDING_POOL_ADDRESS]
  _enableBurning:            false
  _tokenizedStrategyAddress: 0xb27064a2c51b8c5b39a5bb911ad34db039c3ab9c

Transaction 2: Approve USDC

Target:   0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC)
Function: approve(address,uint256)
Selector: 0x095ea7b3
Value:    0

Parameters:
  spender: [STRATEGY_ADDRESS] (from Tx 1)
  amount:  1000000000000 (1M USDC with 6 decimals)

Transaction 3: Deposit USDC

Target:   [STRATEGY_ADDRESS] (from Tx 1)
Function: deposit(uint256,address)
Selector: 0x6e553f65
Value:    0

Parameters:
  assets:   1000000000000 (1M USDC with 6 decimals)
  receiver: 0x36bD3044ab68f600f6d3e081056F34f2a58432c4 (Treasury)

Generate Calldata

forge script partners/shutter_dao_0x36/script/GenerateProposalCalldata.s.sol --fork-url $ETH_RPC_URL -vvvv

Post-Deployment Operations

Harvest Operation

Target:   [STRATEGY_ADDRESS]
Function: report()
Selector: 0x2606a10b
Value:    0

Calldata: 0x2606a10b

Note: Called by management or keeper to harvest yield.

Emergency Operations

Shutdown Strategy

Target:   [STRATEGY_ADDRESS]
Function: shutdownStrategy()
Selector: 0xbe8f1668

Effect: Stops new deposits/mints, allows withdrawals.
Access:  management or emergencyAdmin

Emergency Withdraw

Target:   [STRATEGY_ADDRESS]
Function: emergencyWithdraw(uint256)
Selector: 0x5312ea8e

Parameters:
  _amount: Amount to withdraw (up to full balance)

Prerequisite: Strategy must be shutdown first.
Access:       management or emergencyAdmin

Quick Reference: Function Selectors

Function Selector Target Purpose
createStrategy(...)0x31d89943Morpho FactoryDeploy strategy
approve(address,uint256)0x095ea7b3USDCAllow spending
deposit(uint256,address)0x6e553f65StrategyDeposit funds
withdraw(uint256,address,address)0xb460af94StrategyWithdraw funds
report()0x2606a10bStrategyHarvest yield
shutdownStrategy()0xbe8f1668StrategyEmergency shutdown
emergencyWithdraw(uint256)0x5312ea8eStrategyEmergency exit

References